home *** CD-ROM | disk | FTP | other *** search
- ; Modified 8/24/85 for use with QuickBasic Compiler
-
- XM_CALC SEGMENT PUBLIC 'CODESG'
- ASSUME CS:XM_CALC
- PUBLIC XMODEM
- ;
- CHK_SUM DB 0
- CRC_VAL DW 0 ;CRC VARIABLE
- STRG_LEN DW 0 ;CHANGED TO LENGTH OF STRING PASSED
- STRG_LOC DW 0
- STRG_MSG DB 255 DUP (' ') ;COMMAND CHARS (+CR) GO INTO HERE
- ;
- ;
- CRC_CALC PROC ;AT TIME OF CALL:
- MOV CX,0008H ; AL=CHARACTER
- MOV BX,CRC_VAL
- LOOP0:
- SHL AL,1
- RCL BX,1
- JNC LOOP1
- XOR BX,1021H
- LOOP1:
- LOOP LOOP0
- MOV CRC_VAL,BX
- RET
- CRC_CALC ENDP
- ;
- ;
- XMODEM PROC FAR
- PUSH BP
- MOV BP,SP
- MOV CHK_SUM,0 ;INITIALIZE
- MOV CRC_VAL,0
- ;
- MOV SI,[BP+14] ;GET STRING DESCRIPTOR
- MOV BL,[SI+ 2] ;REARRANGE LOW/HIGH BYTES
- MOV BH,[SI+ 3] ;NOW BX HOLDS THE ADDRESS OF THE STRING
- MOV STRG_LOC,BX ;STORE IT
- MOV AX,[SI] ;GET STRING LENGTH
- MOV STRG_LEN,AX ;STORE IT
- ;
- MOV CX,STRG_LEN ;STORE LENGTH IN CX
- MOV SI,STRG_LOC ;STORE OFFSET TO STRING IN SI
- PUSH CS
- POP ES
- MOV DI,OFFSET STRG_MSG ;ES:DI = LOCATION OF VARIABLE
- REP MOVSB ;FILL STRG_MSG WITH STRING
- ;
- PUSH DS ;SAVE DS
- PUSH CS
- POP DS
- MOV CX,0 ;INITIALIZE COUNTER TO 0
- LOOP:
- MOV BX,OFFSET STRG_MSG
- ADD BX,CX
- PUSH CX ;SAVE CX
- MOV AL,[BX]
- ADD AL,CHK_SUM ;ADD AL TO CHK_SUM
- MOV CHK_SUM,AL
- MOV AL,[BX] ;SET AL TO CHARACTER BEFORE CALL
- CALL CRC_CALC ;CALL CRC CALC
- POP CX ;RESTORE CX
- INC CX ;INCREMENT COUNTER
- CMP CX,STRG_LEN
- JL LOOP ;LOOP UNTIL ALL CHARS PROCESSED
- ;
- POP DS ;RESTORE DS
- MOV BX,CS:CRC_VAL ;PASS BACK THE CRC VALUE
- MOV SI,[BP+ 6] ;AND CRC HIGH AND LOW BYTES
- MOV [SI],BL
- MOV SI,[BP+ 8]
- MOV [SI],BH
- MOV SI,[BP+10]
- MOV [SI],BX
- MOV BL,CS:CHK_SUM ;PASS BACK THE CHECK SUM
- MOV SI,[BP+12]
- MOV [SI],BL
- ;
- PUSH CS ;CLEAN UP WORK TO RETURN TO BASIC
- POP ES
- POP BP
- RET 10
- XMODEM ENDP
- XM_CALC ENDS
- END
-